*********************************************************************
This article is being presented through the *StarBoard* Journal of
the FlagShip/StarShip SIGs (Special Interest Groups) on the Delphi
and GEnie telecommunications networks.  Permission is hereby granted
to non-profit organizations only to reprint this article or pass it
along electronically as long as proper credit is given to both the
author and the *StarBoard* Journal.
*********************************************************************
                                  -
                            CP/M Primer #2
                                  -
 Disk and File Attributes - Time/Date Stamping - Password Protection
                                  -
               By: Mike Mantino (GEnie address: MIKEM)
                                  -

Last month we discussed the DIR and DIR.COM utilities (built-in and
transient) which allowed us to view the disk directory in a variety of
ways using a number of options.  We were able to acquire listings of
all the files we had on each drive and in each 'user area' of the disk,
and in doing so we noticed that these files had their own distinct
attributes.  Some were SYS files, others were DIR files, and they all
had a two-letter identifier signifying whether they were Read-Only (RO)
or Read-Write (RW).  So, too, we had brushed over the term
'time-stamping' and inferred that it was possible to password-protect
individual files and/or whole disks.  This month we will attempt to
change and set these attributes and parameters in order to give you full
control over your disk files.

                                  -

The first thing we need to do upon boot-up of CP/M is to set the
current time and date.  This will later allow us to use time and date
stamping of our files, so we can quickly locate the most recent copy of
a file and check to see when it was last updated or accessed from
disk.  Let's do this right now.

The DATE command is another transient utility that allows us to change
the current date and time of day.  When you boot-up CP/M, the date and
time are defaulted to the creation date of your system.  Let's see what
that current time and date is.  At the A> prompt, type DATE.  CP/M will
respond with something like:  SAT 07/18/85 10:45:10     Now we will
change this to the current date and time.  There are two ways of doing
this.  The first is to type DATE followed by the current day and time,
in the format:  MM/DD/YY HH:MM:SS    For example, we might type:

  A> DATE 08/10/86 11:30:00

CP/M would respond with:

  Press any key to set time.

Another way of going about the same thing, would be to type DATE SET,
and letting CP/M prompt us for input.  For instance:

  A> DATE SET

Would cause CP/M to respond with:

  Enter todays date (MM/DD/YY):

Enter the date, or just press <RETURN> to skip the date, and CP/M will
then respond with:

  Enter the time (HH:MM:SS):

Enter the time, or press <RETURN> to skip the time, and CP/M will
respond with:

  Press any key to set the time.

Now that we have set the current date and current time, let us check
to ensure that CP/M has indeed noticed our actions.  At the A> prompt,
type DATE and make sure that the date and time is actually what we had
set it to.

                                  -

We are ready to begin time and date-stamping of our files on disk and
set up blank disks for future stamping.

To do this, we must first run the INITDIR utility in order to
initialize the directory.  If files already exist on the disk, INITDIR
will check the space available for date and time stamps in the
directory.  If there is not enough room there, INITDIR will not
initialize it and will return an error message.  If the disk is
blank, the utility will set up your disk and set aside the appropriate
space in the directory to store the stamping.  INITDIR can also be used
to clear time/date stamping from an already initialized disk, thus
recovering some disk space.  Let's take an example of how all of this
is accomplished.

  A> INITDIR

The system will return the following message:

  INITDIR WILL ACTIVATE TIME STAMPS FOR SPECIFIED DRIVE.
  Do you really want to re-format the directory: A  (Y/N)?

If the directory were already initialized for time and date stamping,
then INITDIR would ask you:

  Directory is already re-formatted.
  Do you wish to recover date/time stamping directory space (Y/N)?

Answering Y will eliminate stamping on that disk and recover space.  If
you answer N, then stamping remains active and INITDIR will then ask:

  Do you want the existing date/time stamping cleared (Y/N)?

Entering Y will clear all current dates and times, but keep the disk
initialized for further stamping.

                                  -

Now we are ready to stamp some files with the current date and time,
and once that is accomplished, any time we access or change that file,
the current time and date can be easily assigned.  We need to use the
SET utility to set-up the file for the current time and date.

This SET utility is one with lots of power.  Besides using it for time
and date stamping, it can allow us to set the file attributes (R/O and
R/W, DIR and SYS), set the disk attributes (R/O and R/W), assign a
label to the disk (just like a disk name in 64/128 mode), and assign
passwords to the disk and/or files.  More about these other options
later.  First, let's finish up time/date stamping.

SET has three accompanying specifications for time and date stamping.
They are:  ACCESS, CREATE, and UPDATE.   The first two, ACCESS and
CREATE, are mutually exclusive options, meaning that when one is turned
on, the other is automatically off.

SET [CREATE=ON] is used before you create a CP/M file and will record
the creation time of that file.

SET [ACCESS=ON] is used to record when the last file was accessed.

SET [UPDATE=ON] is used to record the time that the file was last
updated.

Thus, if you use both CREATE and UPDATE together, editing a file will
change both the UPDATE and CREATE stamps.

To view the file-stamping on your disk, all you have to do is use the
DIR.COM utility with the [FULL] specification, like this:

  A> DIR [FULL]

The best way to understand how this stamping operation works is to set
ACCESS to ON, then load in a file on your disk.  Abort from the
program and type in the DIR [FULL] command to see what has happened.

                                  -

Now we will review how to set the file attributes to READ ONLY,
READ/WRITE, SYS, and DIR.

As you know, files that have a SYS designation are SYStem files which,
when in USER area 0 can be accessed from *any* USER area of the disk.
To set a file to a SYStem file, we would call up the SET command again,
but in this form (assuming that the file is called TESTING.COM):

  A> SET TESTING.COM [SYS]

We could have, at the same time, set that same file so that it were
READ ONLY by typing this:

  A> SET TESTING.COM [RO SYS]

The same holds true for the DIR and READ/WRITE attributes.

That was easy enough, and so is doing the same for the drive itself!
To set drive B for READ ONLY, we would type:

  A> SET B: [RO]

NOTE that setting a drive to READ ONLY would mean that PIP could not
copy a file to it, RENAME could not rename a file on it, ERASE could
not delete a file from it, and you could not perform any disk writing
operation.  Specifying READ/WRITE (RW) will reset the drive to its
original state, as will pressing CONTROL-C.

                                  -

Now, let's set up a label for your disk, just like giving the disk a
name in C-64 or C-128 mode.

We can assign a label name of up to eight characters, plus a three
character type, similar to a file name and file type.  For instance:

  A> SET [NAME=GAMES.108]

This would give our disk the name GAMES.108.  If we did not specify any
name, the label would be defaulted to LABEL.  Labels make it easy for
us to catalog all of our CP/M disks.

                                  -

We aren't done with the SET utility yet!  If you've ever wanted to
password-protect a disk or disk file before, now is your chance.

To assign a password to the entire disk (actually to the disk label),
all you need to do is use the following format.  We will assume that
you want to use a password of GENIE......

  A> SET [PASSWORD=GENIE]

Easy enough.  Hereafter, the SET command will prompt for this password
whenever you (or anyone else) tries to set any of the functions that
are controlled by the SET utility.  If you do not set up a disk
password (label password), then anyone who has access to the disk can
set up other attributes using SET, which will make the disk
inaccessible to *you*!

Any time you want to remove this password from the disk label, use the
same syntax you used to assign it, but instead of the word just hit
<RETURN>.  Example:

  A> SET [PASSWORD=<RETURN>

Again, note that the first bracket '[' must be used for specs, but the
ending bracket ']' is optional.

                                  -

Along with password-protecting the disk, we can also assign passwords
to individual files on that disk.  To do this, we must first tell CP/M
to turn on protection for all disk files.  We do this with yet another
form of the SET utility:

  A> SET [PROTECT=ON]

Now we specify the file which we want to assign a password to, and then
the password itself:

  A> SET TESTFILE.TXT [PASSWORD=GENIE]

Passwords for files do not need to be the same as those you use for the
disk.  Also, passwords can be up to eight characters in length, and all
lower-case letters are translated to uppercase.  In addition, you may
use wildcards in your filespecs and SET will assign that password to
all files that match.

Now we can set a password-protection mode for those files with
passwords.  There are four forms we can use: READ, WRITE, DELETE, and
NONE.  An example of this would be:

  A> SET TESTFILE.TXT [PROTECT=READ]

Here is an explanation of the individual modes and the level of
protection they give your files:

READ - The password is required in order to read, copy, write, delete
or rename the file.

WRITE - The password is required in order to write, rename, or delete
the file.  The password is not necessary to read the file.

DELETE - The password is required only if you want to rename or delete
the file.  The password is not necessary to modify or read the file.

NONE - No password is in existence for the file.  If one does exist,
you may use this to delete the password.

Here are two examples of chaining specs in order to password protect
files:

  A> SET TESTFILE.TXT [PASSWORD=GENIE PROTECT=WRITE]
  A> SET *.TXT [PASSWORD=GENIE PROTECT=WRITE]

The first example sets the password 'GENIE' to the file called
TESTFILE.TXT, and makes it WRITE protected to prevent someone from
editing it.

The second example does the same thing, but because we used the *
wildcard, *all* text files on the disk will be given the password and
WRITE protection.

                                  -

WARNING!!!!   Always make a record of your passwords!  You will not be
able to access your files without your file-passwords, unless you turn
off the protection for the whole disk.  AND!!.....if you forget the
password to the disk itself, you cannot access the disk in order to
access those files!

                                  -

NOTES:  I realize that the options we have discussed this month are not
really basic essentials that one needs to know, but they do go a long
way in familiarizing you with the CP/M environment and the syntax that
is used in almost all programs and utilities encountered in this
environment.

Next month we will discuss the KEYFIG utility that allows us to set-up
default colors, change our keyboard configuration, and execute them
automatically upon boot-up.  Also, we will take a peek into SUBMIT files
and the PROFILE.SUB start-up file.  Same time, same station!

-Mike Mantino

